import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:intl/intl.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:heroicons/heroicons.dart';
import 'dart:math' as math;
import '../constants/app_colors.dart';
import '../constants/app_theme.dart';
import '../providers/mood_provider.dart';
import '../providers/diary_provider.dart';
import '../widgets/hand_drawn_icon.dart';
import '../widgets/hand_drawn_decoration.dart';
import '../widgets/hand_drawn_module_icon.dart';
import '../widgets/hand_drawn_nav_icon.dart';
import 'mood_screen.dart';
import 'diary_screen.dart';
import 'stats_screen.dart';
import 'profile_screen.dart';
import 'psychological_test_screen.dart';
import 'crisis_intervention_screen.dart';
import 'thought_reshaping_screen.dart';

/// 首页主类，使用StatefulWidget以支持状态变化
class HomeScreen extends StatefulWidget {
  // 构造函数，接收可选的key参数
  const HomeScreen({Key? key}) : super(key: key);

  @override
  // 创建状态类实例
  State<HomeScreen> createState() => _HomeScreenState();
}

/// 首页状态类，管理首页的状态和行为
class _HomeScreenState extends State<HomeScreen> {
  // 页面控制器，用于管理PageView中的页面切换
  final PageController _pageController = PageController();
  // 当前选中的底部导航栏索引
  int _currentIndex = 0;

  @override
  void initState() {
    // 调用父类初始化方法
    super.initState();
    // 初始化数据
    _initData();
  }

  @override
  void dispose() {
    // 销毁页面控制器，避免内存泄漏
    _pageController.dispose();
    // 调用父类销毁方法
    super.dispose();
  }

  /// 初始化数据方法，异步加载情绪和日记数据
  Future<void> _initData() async {
    // 获取情绪数据提供者实例，listen:false表示不需要监听变化
    final moodProvider = Provider.of<MoodProvider>(context, listen: false);
    // 获取日记数据提供者实例
    final diaryProvider = Provider.of<DiaryProvider>(context, listen: false);
    
    // 初始化情绪数据
    await moodProvider.init();
    // 初始化日记数据
    await diaryProvider.init();
  }

  /// 页面改变回调方法，当PageView滑动切换页面时调用
  void _onPageChanged(int index) {
    // 更新状态，切换当前选中的索引
    setState(() {
      _currentIndex = index;
    });
  }

  /// 底部导航栏点击回调方法
  void _onItemTapped(int index) {
    // 使用动画效果切换到对应页面
    _pageController.animateToPage(
      index,
      // 动画持续时间
      duration: const Duration(milliseconds: 300),
      // 动画曲线
      curve: Curves.easeInOut,
    );
  }

  @override
  /// 构建UI方法
  Widget build(BuildContext context) {
    // 获取当前时间
    final now = DateTime.now();
    // 创建时间格式化器，格式为小时:分钟
    final timeFormat = DateFormat('HH:mm');
    // 格式化当前时间
    final currentTime = timeFormat.format(now);
    
    // 根据当前小时确定问候语
    String greeting = '早上好';
    if (now.hour >= 12 && now.hour < 18) {
      greeting = '下午好';
    } else if (now.hour >= 18) {
      greeting = '晚上好';
    }

    // 构建脚手架，包含主体和底部导航栏
    return Scaffold(
      // 设置背景颜色为纯白色
      backgroundColor: Colors.white,
      // 主体使用PageView，支持左右滑动切换页面
      body: PageView(
        // 关联页面控制器
        controller: _pageController,
        // 页面改变回调
        onPageChanged: _onPageChanged,
        // 页面列表
        children: const [
          // 首页内容
          _HomeContent(),
          DiaryScreen(),
          ProfileScreen(),
        ],
      ),
      // 底部导航栏容器
      bottomNavigationBar: Container(
        // 装饰，添加白色背景和阴影效果
        decoration: BoxDecoration(
          color: Colors.white,
          // 添加顶部阴影
          boxShadow: [
            BoxShadow(
              color: Colors.black.withOpacity(0.05),
              blurRadius: 8,
              offset: const Offset(0, -2),
            ),
          ],
        ),
        // 底部导航栏组件
        child: BottomNavigationBar(
          // 当前选中索引
          currentIndex: _currentIndex,
          // 点击回调
          onTap: _onItemTapped,
          // 设置透明背景，因为Container已经有背景色
          backgroundColor: Colors.transparent,
          // 移除默认阴影
          elevation: 0,
          // 固定类型，所有项目均匀分布
          type: BottomNavigationBarType.fixed,
          // 选中项目颜色
          selectedItemColor: AppColors.primary,
          // 未选中项目颜色
          unselectedItemColor: AppColors.textSecondary,
          // 选中项目标签样式，使用中文手写字体
          selectedLabelStyle: GoogleFonts.zcoolKuaiLe(
            fontSize: 14,
            fontWeight: FontWeight.bold,
          ),
          // 未选中项目标签样式
          unselectedLabelStyle: GoogleFonts.zcoolKuaiLe(
            fontSize: 14,
          ),
          // 导航栏项目列表
          items: [
            // 首页
            BottomNavigationBarItem(
              icon: HeroIcon(
                HeroIcons.home,
                size: 24,
                style: HeroIconStyle.outline,
                color: _currentIndex == 0 ? AppColors.primary : AppColors.textSecondary,
              ),
              label: '首页',
            ),
            // 回顾
            BottomNavigationBarItem(
              icon: HeroIcon(
                HeroIcons.clock,
                size: 24,
                style: HeroIconStyle.outline,
                color: _currentIndex == 1 ? AppColors.primary : AppColors.textSecondary,
              ),
              label: '回顾',
            ),
            // 我的
            BottomNavigationBarItem(
              icon: HeroIcon(
                HeroIcons.user,
                size: 24,
                style: HeroIconStyle.outline,
                color: _currentIndex == 2 ? AppColors.primary : AppColors.textSecondary,
              ),
              label: '我的',
            ),
          ],
        ),
      ),
    );
  }
}

/// 首页内容类，负责展示首页的主要内容
class _HomeContent extends StatelessWidget {
  // 构造函数
  const _HomeContent({Key? key}) : super(key: key);

  // 判断当前是否是白天（6:00-18:00）
  bool _isDaytime() {
    final now = DateTime.now();
    return now.hour >= 6 && now.hour < 18;
  }
  //
  // // 获取左侧天气图标
  // Widget _getWeatherIcon() {
  //   return Icon(
  //     _isDaytime()
  //         ? Icons.wb_sunny_outlined  // 白天显示太阳
  //         : Icons.nightlight_outlined,  // 晚上显示月亮
  //     size: 32,
  //     color: _isDaytime() ? Colors.amber : Colors.blueGrey,
  //   );
  // }
  //
  // // 获取右侧小人图标
  // Widget _getPersonIcon() {
  //   return Icon(
  //     _isDaytime()
  //         ? Icons.directions_walk  // 白天显示走路的小人
  //         : Icons.nightlight,  // 晚上显示睡觉的小人
  //     size: 32,
  //     color: AppColors.textPrimary,
  //   );
  // }

  @override
  /// 构建UI方法
  Widget build(BuildContext context) {
    // 获取当前时间
    final now = DateTime.now();
    // 创建时间格式化器
    final timeFormat = DateFormat('HH:mm');
    // 格式化当前时间
    final currentTime = timeFormat.format(now);
    
    // 根据当前小时确定问候语
    String greeting = '早上好';
    if (now.hour >= 12 && now.hour < 18) {
      greeting = '下午好';
    } else if (now.hour >= 18) {
      greeting = '晚上好';
    }

    // 使用SafeArea确保内容不会被系统UI（如状态栏）遮挡
    return SafeArea(
      // 使用SingleChildScrollView使内容可滚动
      child: SingleChildScrollView(
        // 添加内边距
        child: Padding(
          // 四周内边距，底部增加额外空间
          padding: const EdgeInsets.only(left: 24, right: 24, top: 16, bottom: 40),
          // 列布局，从上到下排列子组件
          child: Column(
            // 水平居中对齐
            crossAxisAlignment: CrossAxisAlignment.center,
            // 子组件列表
            children: [
              // 顶部空白
              const SizedBox(height: 4),
              
              // 标题"心情阁"
              Text(
                '情绪小记',
                // 使用中文手写字体
                style: GoogleFonts.zcoolKuaiLe(
                  fontSize: 36,
                  // fontWeight: FontWeight.bold,
                ),
              ),
              
              // 标题下方空白
              const SizedBox(height: 16),
              
              // 天气和小人区域
              Container(
                // 居中显示小人
                child: SizedBox(
                  width: 180,
                  height: 180,
                  child: Image.asset(
                    'assets/smile.png',
                    fit: BoxFit.cover,
                  ),
                ),
              ),
              
              // 天气区域下方空白
              const SizedBox(height: 16),
              
              // 问候语区域
              Column(
                children: [
                  // 时间段问候语
                  Text(
                    greeting,
                    style: GoogleFonts.zcoolKuaiLe(
                      fontSize: 32,
                      // fontWeight: FontWeight.bold,
                    ),
                  ),
                  // 问候语与格言之间的间距
                  const SizedBox(height: 4),
                  // 格言
                  Text(
                    '每一瞬心绪都是银河中的光点',
                    style: GoogleFonts.zcoolKuaiLe(
                      fontSize: 18,
                      color: AppColors.textSecondary,
                    ),
                  ),
                ],
              ),
              
              // 问候语区域下方空白
              const SizedBox(height: 40),
              
              // 功能模块网格
              GridView.count(
                // 每行两个功能卡片
                crossAxisCount: 2,
                // 内容自适应
                shrinkWrap: true,
                // 禁用滚动，因为外层已有滚动容器
                physics: NeverScrollableScrollPhysics(),
                // 项目之间的垂直间距
                mainAxisSpacing: 24,
                // 项目之间的水平间距
                crossAxisSpacing: 24,
                // 宽高比，控制卡片形状
                childAspectRatio: 1.35,
                // 功能卡片列表
                children: [
                  // 情绪日记卡片
                  _buildModuleCard(
                    context,
                    title: '情绪日记',
                    subtitle: '记录情绪变化',
                    onTap: () {
                      // 点击跳转到情绪记录页面
                      Navigator.push(
                        context,
                        MaterialPageRoute(builder: (context) => MoodScreen()),
                      );
                    },
                  ),
                  // 心理测试卡片
                  _buildModuleCard(
                    context,
                    title: '心理测试',
                    subtitle: '评估心理健康状态',
                    onTap: () {
                      Navigator.push(
                        context,
                        MaterialPageRoute(builder: (context) => const PsychologicalTestScreen()),
                      );
                    },
                  ),
                  // 想法重塑卡片
                  _buildModuleCard(
                    context,
                    title: '想法重塑',
                    subtitle: '使用AI纠正负面想法',
                    onTap: () {
                      Navigator.push(
                        context,
                        MaterialPageRoute(
                          builder: (context) => const ThoughtReshapingScreen(),
                        ),
                      );
                    },
                  ),
                  // 危机干预卡片
                  _buildModuleCard(
                    context,
                    title: '危机干预',
                    subtitle: '紧急情况处理',
                    onTap: () {
                      Navigator.push(
                        context,
                        MaterialPageRoute(
                          builder: (context) => const CrisisInterventionScreen(),
                        ),
                      );
                    },
                  ),
                ],
              ),
              
              // 底部额外空间，确保内容不被底部导航栏遮挡
              const SizedBox(height: 8),
            ],
          ),
        ),
      ),
    );
  }

  /// 构建功能模块卡片的方法
  Widget _buildModuleCard(
    BuildContext context, {
    required String title,
    required String subtitle,
    required VoidCallback onTap,
  }) {
    // 根据不同的功能选择对应的图标
    HeroIcons getIcon() {
      switch (title) {
        case '情绪日记':
          return HeroIcons.bookOpen;
        case '心理测试':
          return HeroIcons.clipboardDocumentList;
        case '想法重塑':
          return HeroIcons.sparkles;
        case '危机干预':
          return HeroIcons.shieldExclamation;
        default:
          return HeroIcons.questionMarkCircle;
      }
    }

    return GestureDetector(
      onTap: onTap,
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Container(
            width: 60,
            height: 60,
            decoration: BoxDecoration(
              color: Colors.white,
              shape: BoxShape.circle,
            ),
            child: Center(
              child: HeroIcon(
                getIcon(),
                size: 32,
                style: HeroIconStyle.outline,
                color: AppColors.textPrimary,
              ),
            ),
          ),
          const SizedBox(height: 0),
          Text(
            title,
            style: GoogleFonts.zcoolKuaiLe(
              fontSize: 20,
              // fontWeight: FontWeight.bold,
            ),
          ),
          const SizedBox(height: 1),
          Text(
            subtitle,
            style: GoogleFonts.zcoolKuaiLe(
              fontSize: 14,
              color: AppColors.textSecondary,
            ),
            textAlign: TextAlign.center,
          ),
        ],
      ),
    );
  }
}

/// 手绘风格的人脸绘制类
class _HandDrawnFacePainter extends CustomPainter {
  @override
  void paint(Canvas canvas, Size size) {
    // 创建画笔
    final paint = Paint()
      ..color = Colors.black       // 设置颜色为黑色
      ..style = PaintingStyle.stroke  // 设置样式为描边
      ..strokeWidth = 2.0          // 设置线宽
      ..strokeCap = StrokeCap.round;  // 设置线帽为圆形
    
    // 计算中心点
    final center = Offset(size.width / 2, size.height / 2);
    // 计算半径
    final radius = size.width * 0.4;
    
    // 绘制圆脸
    final facePath = Path();
    // 创建伪随机数生成器，确保每次绘制相同大小的脸时获得一致的随机效果
    final random = _PseudoRandom(size.width.toInt() * 1000 + size.height.toInt());
    
    // 使用多个贝塞尔曲线绘制手绘风格的圆脸
    double startAngle = 0;
    double sweepAngle = 30;
    // 循环绘制圆脸的各部分
    while (startAngle < 360) {
      // 将角度转换为弧度
      final startRad = startAngle * math.pi / 180;
      final endRad = (startAngle + sweepAngle) * math.pi / 180;
      
      // 计算起点坐标，添加随机偏移使线条不规则
      final start = Offset(
        center.dx + math.cos(startRad) * radius * (0.95 + random.nextDouble() * 0.1),
        center.dy + math.sin(startRad) * radius * (0.95 + random.nextDouble() * 0.1),
      );
      
      // 计算终点坐标，添加随机偏移
      final end = Offset(
        center.dx + math.cos(endRad) * radius * (0.95 + random.nextDouble() * 0.1),
        center.dy + math.sin(endRad) * radius * (0.95 + random.nextDouble() * 0.1),
      );
      
      // 计算控制点，用于贝塞尔曲线
      final controlPoint = Offset(
        center.dx + math.cos((startAngle + sweepAngle / 2) * math.pi / 180) * radius * 1.1,
        center.dy + math.sin((startAngle + sweepAngle / 2) * math.pi / 180) * radius * 1.1,
      );
      
      // 如果是起始点，则移动到该点
      if (startAngle == 0) {
        facePath.moveTo(start.dx, start.dy);
      }
      
      // 使用二次贝塞尔曲线连接点
      facePath.quadraticBezierTo(controlPoint.dx, controlPoint.dy, end.dx, end.dy);
      
      // 增加角度，继续下一段曲线
      startAngle += sweepAngle;
    }
    
    // 绘制脸部轮廓
    canvas.drawPath(facePath, paint);
    
    // 计算眼睛位置
    final leftEyeCenter = Offset(center.dx - radius * 0.35, center.dy - radius * 0.1);
    final rightEyeCenter = Offset(center.dx + radius * 0.35, center.dy - radius * 0.1);
    
    // 绘制左眼
    canvas.drawCircle(leftEyeCenter, radius * 0.12, paint);
    
    // 绘制右眼
    canvas.drawCircle(rightEyeCenter, radius * 0.12, paint);
    
    // 绘制嘴巴（平淡的表情）
    final mouthPath = Path();
    // 嘴巴左端点
    final mouthStart = Offset(center.dx - radius * 0.25, center.dy + radius * 0.35);
    // 嘴巴右端点
    final mouthEnd = Offset(center.dx + radius * 0.25, center.dy + radius * 0.35);
    
    // 移动到嘴巴左端点
    mouthPath.moveTo(mouthStart.dx, mouthStart.dy);
    // 使用二次贝塞尔曲线绘制嘴巴
    mouthPath.quadraticBezierTo(
      center.dx, 
      center.dy + radius * 0.35, 
      mouthEnd.dx, 
      mouthEnd.dy
    );
    
    // 绘制嘴巴
    canvas.drawPath(mouthPath, paint);
  }
  
  @override
  // 判断是否需要重绘
  bool shouldRepaint(covariant CustomPainter oldDelegate) {
    return false; // 返回false表示不需要重绘
  }
}

/// 伪随机数生成器，用于生成一致的"随机"效果
class _PseudoRandom {
  // 随机数种子
  int _seed;
  
  // 构造函数，接收初始种子
  _PseudoRandom(this._seed);
  
  // 生成0到1之间的伪随机数
  double nextDouble() {
    // 使用线性同余法生成伪随机数
    _seed = (_seed * 1103515245 + 12345) & 0x7FFFFFFF;
    // 归一化到0-1范围
    return _seed / 0x7FFFFFFF;
  }
} 